home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / misc / quickhelp / quickhelp_lib / quickhelp_lib.c < prev    next >
C/C++ Source or Header  |  1999-09-06  |  7KB  |  260 lines

  1. /* quickhelp_lib.c © Copyright Paweî Marciniak 1996. */
  2. #include <string.h>
  3. #include <exec/types.h>
  4. #include <exec/memory.h>
  5. #include <intuition/intuition.h>
  6. #include <libraries/locale.h>
  7. #include <graphics/text.h>
  8. #include <proto/dos.h>
  9. #include <proto/exec.h>
  10. #include <proto/intuition.h>
  11. #include <proto/graphics.h>
  12. #include <proto/diskfont.h>
  13. #include <clib/exec_protos.h>
  14. #include <clib/locale_protos.h>
  15. #include <pragmas/exec_pragmas.h>
  16. #include <pragmas/locale_pragmas.h>
  17. #include <utility/tagitem.h>
  18. #include <proto/utility.h>
  19.  
  20. #include    "include/clib/QuickHelp_protos.h"
  21.  
  22. int __saveds __UserLibInit( VOID );
  23. void __saveds __UserLibCleanup( VOID );
  24.  
  25. extern struct ExecBase    *SysBase;
  26. struct GfxBase                    *GfxBase;
  27. struct IntuitionBase        *IntuitionBase;
  28. struct Library                    *UtilityBase;
  29. struct Window                        *HelpWindow;
  30.  
  31. struct Locale        *locale;
  32. struct Catalog    *catalog;
  33. struct Library    *LocaleBase;
  34.  
  35. STRPTR errstr=NULL;
  36.  
  37. /* Komunikaty o bîëdach */
  38. STRPTR ERR_MSG_TOOMANY="Too many new line chars";
  39. STRPTR ERR_MSG_NOCATALOG="Couldn't open QuickHelp_lib.catalog";
  40. STRPTR ERR_MSG_NOLOCALE="Couldn't open locale.library";
  41. STRPTR ERR_MSG_STRLENNULL="No text";
  42. STRPTR ERR_MSG_NOMEM="Couldn't alloc memory for text";
  43. STRPTR ERR_MSG_STRTOOLONG="Longest text is too long";
  44. STRPTR ERR_MSG_NOHELPWIN="Couldn't open help window";
  45.  
  46. STRPTR verstr="\0$VER: quickhelp.library 37.03 ("__AMIGADATE__" "__TIME__")";
  47. STRPTR overstr="QuickHelp © Paweî Marciniak 1996-1999";
  48.  
  49. /* definicja tagów */
  50.  
  51. #define OH_Dummy    (TAG_USER + 1)
  52.  
  53. #define OH_PozX            (OH_Dummy + 0x01)
  54. #define OH_PozY            (OH_Dummy + 0x02)
  55.  
  56. int __saveds __UserLibInit( VOID )
  57. {
  58.     int retval = 1;
  59.  
  60.   if (GfxBase = OpenLibrary( "graphics.library", 37L ))
  61.   {
  62.         if (IntuitionBase = OpenLibrary( "intuition.library", 37L ))
  63.     {
  64.         if (UtilityBase = OpenLibrary( "utility.library", 37L )) 
  65.         {
  66.                 retval = 0;
  67.             }
  68.         }
  69.     }
  70.     if(LocaleBase=OpenLibrary("locale.library",38))
  71.     {
  72.         if(catalog=OpenCatalog(NULL, "quickhelp_lib.catalog",   
  73.                             OC_BuiltInLanguage, "english", TAG_DONE))
  74.         {
  75.             ERR_MSG_TOOMANY=GetCatalogStr(catalog, 1002, ERR_MSG_TOOMANY);
  76.             ERR_MSG_STRLENNULL=GetCatalogStr(catalog, 1003, ERR_MSG_STRLENNULL);
  77.             ERR_MSG_NOMEM=GetCatalogStr(catalog, 1004, ERR_MSG_NOMEM);
  78.             ERR_MSG_STRTOOLONG=GetCatalogStr(catalog, 1005, ERR_MSG_STRTOOLONG);
  79.             ERR_MSG_NOHELPWIN=GetCatalogStr(catalog, 1006, ERR_MSG_NOHELPWIN);
  80.         }
  81.         else
  82.             errstr=ERR_MSG_NOCATALOG;
  83.     }
  84.     else
  85.         errstr=ERR_MSG_NOLOCALE;
  86.   return( retval );
  87. }
  88.  
  89.  
  90. VOID __saveds __UserLibCleanup( VOID )
  91. {
  92.     if(catalog)                CloseCatalog( catalog );
  93.     if(LocaleBase)        CloseLibrary( LocaleBase );
  94.     if(UtilityBase)        CloseLibrary( UtilityBase );
  95.     if(GfxBase)                CloseLibrary( (struct Library *) GfxBase );
  96.     if(IntuitionBase)    CloseLibrary( (struct Library *) IntuitionBase );
  97. }
  98.  
  99. /* Funkcja OpenHelp (c) Paweî Marciniak 1996 */
  100. BOOL __saveds __asm LIBOpenHelpA(register __a0 STRPTR texts,
  101.                                                                 register __a1 struct TextFont *TxFont,
  102.                                                                 register __a2 struct Window *APP_Window,
  103.                                                                 register __a3 struct TagItem *Tags)
  104. {
  105.     STRPTR text=NULL;
  106.     APTR mem=NULL;
  107.     char *adresy[10]; /* Adresy poszczególnych tekstów */
  108.  
  109.     WORD WinWidth;
  110.     WORD WinHeight;
  111.     WORD WinLeft = -1;
  112.     WORD WinTop = -1;
  113.     WORD factor=8;
  114.     struct TagItem *ti, *TagsTmp;
  115.  
  116.     register int licznik=0;
  117.     register int loop=0, new=0, old=0, numtab=0;
  118.  
  119.   if(!strlen(texts))
  120.   {
  121.       errstr=ERR_MSG_STRLENNULL;
  122.     return FALSE;
  123.    }
  124. /* Alokujemy pamiëê dla tekstu */
  125.     if(!(text=AllocVec( (strlen(texts)+1), MEMF_ANY )))
  126.     {
  127.         errstr=ERR_MSG_NOMEM;
  128.         return FALSE;
  129.     }
  130.     mem=(APTR)text;
  131. /* Kopiujemy "texts" do naszej pamiëci "text" */
  132.     strcpy(text, texts);
  133. /* Wpisujemy adres pierwszego tekstu do tablicy */
  134.     adresy[licznik]=text;
  135. /* Zamieniamy wszystkie znaki "\n" na "\0", */
  136. /* i wpisujemy ich adresy do tablicy adresy */
  137.     while(*text != '\0')
  138.     {
  139.         if(*text == '\n')
  140.         {
  141.             *text='\0';
  142.             licznik++;
  143.             text++;
  144.             if(licznik==10)
  145.       {
  146.                 FreeVec(mem);
  147.                 mem=NULL;
  148.                 errstr=ERR_MSG_TOOMANY;
  149.                 return FALSE;
  150.       }
  151.       else
  152.                 adresy[licznik]=text;
  153.         }
  154.         else
  155.             text++;
  156.     }
  157.  
  158. /* Szukamy i obliczamy dîugoôê najdîuûszego tekstu */
  159.   while(loop <= licznik)
  160.   {
  161.       new=strlen(adresy[loop]);
  162.       if(new > old)
  163.       {
  164.             old=new;
  165.           numtab=loop;
  166.         }
  167.       loop++;
  168.   }
  169.  
  170.     TagsTmp = Tags;
  171.     while ( ti = NextTagItem( &TagsTmp ) )
  172.     {
  173.         switch ( ti->ti_Tag )
  174.         {
  175.             case OH_PozX:
  176.                 WinLeft = ti->ti_Data;
  177.             break;
  178.             
  179.             case OH_PozY:
  180.                 WinTop = ti->ti_Data;
  181.             break;
  182.             
  183.             default:
  184.             break;
  185.         }
  186.     }
  187.  
  188.  
  189. /* Obliczamy rozmiar okna pomocy */
  190.     WinHeight=((TxFont->tf_YSize) * (licznik+1)) + factor;
  191.     WinWidth=TextLength(APP_Window->RPort, adresy[numtab], strlen(adresy[numtab]));
  192.     WinWidth+=(((factor*2)*APP_Window->WScreen->Width)/640);
  193.     if( WinLeft == -1 || WinTop == -1 )
  194.     {
  195.         WinTop=APP_Window->WScreen->MouseY+(APP_Window->WScreen->RastPort.TxHeight + APP_Window->WScreen->WBorTop);
  196.         WinLeft=APP_Window->WScreen->MouseX-(WinWidth/2);
  197.     }
  198.     if(WinWidth > APP_Window->WScreen->Width)
  199.     {
  200.         FreeVec(mem);
  201.         mem=NULL;
  202.         errstr=ERR_MSG_STRTOOLONG;
  203.         return FALSE;
  204.     }
  205. /* Otwieramy okno */
  206.     if(HelpWindow=OpenWindowTags(0,
  207.                     WA_Left, WinLeft,
  208.                     WA_Top, WinTop,
  209.                     WA_Width, WinWidth,
  210.                     WA_Height, WinHeight,
  211.                     WA_Flags, WFLG_BORDERLESS,
  212.                     WA_AutoAdjust,    TRUE,
  213.                     WA_Activate,    FALSE,
  214.                     WA_CustomScreen, APP_Window->WScreen,
  215.                     TAG_END))
  216.     {
  217.     /* Wypeîniamy okna */
  218.         SetAPen(HelpWindow->RPort, 2);
  219.         RectFill(HelpWindow->RPort, 0, 0, WinWidth-1, WinHeight-1);
  220.     /* Ustawiamu font */
  221.         SetFont(HelpWindow->RPort,TxFont);
  222.     /* i kolory dla fontu */
  223.         SetAPen(HelpWindow->RPort, 1);
  224.         SetBPen(HelpWindow->RPort, 2);
  225.     /* Piszemy nasze tekst */
  226.         loop=0;
  227.       while(loop <= licznik)
  228.       {
  229.             Move(HelpWindow->RPort, (WinWidth-(TextLength(APP_Window->RPort, adresy[loop], strlen(adresy[loop]))))/2, ((HelpWindow->RPort->TxBaseline)+((TxFont->tf_YSize)*loop))+((((factor))))/2);
  230.             Text(HelpWindow->RPort, adresy[loop], strlen(adresy[loop]));
  231.             loop++;
  232.         }
  233.     /* Rysujemy ramki */
  234.         Move(HelpWindow->RPort, 0 , 0);
  235.         Draw(HelpWindow->RPort, 0, WinHeight-1);
  236.         Draw(HelpWindow->RPort, WinWidth-1, WinHeight-1);
  237.         Draw(HelpWindow->RPort, WinWidth-1, 0);
  238.         Draw(HelpWindow->RPort, 0, 0);
  239.         if(mem)    FreeVec(mem);
  240.         mem=NULL;
  241.         return TRUE;
  242.     }
  243.     errstr=ERR_MSG_NOHELPWIN;
  244.     return FALSE;
  245. }
  246.  
  247. /* Funkcja CloseHelp (C) Paweî Marciniak 1996 */
  248. VOID __saveds __asm  LIBCloseHelp( VOID )
  249. {
  250.     if(HelpWindow)
  251.         CloseWindow(HelpWindow);
  252.     HelpWindow=NULL;
  253. }
  254.  
  255. /* Funkcja GetQuickHelpString (C) Paweî Marciniak 1997 */
  256. STRPTR __saveds __asm LIBGetQuickHelpString( VOID )
  257. {
  258.     return( errstr );
  259. }
  260.